package com.itheima.annotation;

/**
 * Description:
 *
 * @author codermao
 * @date 2023/11/2 22:17
 */

import java.lang.reflect.Field;

/**
 * TODO：用注解的方式，对Student对象的属性进行赋值
 *
 *      配置：
 *      解析：注解的解析需要反射，原因是注解用在类中，反射是运行时操作类的技术
 *
 *      1）java程序生命周期有三个阶段
 *          SOURCE -> CLASS ->RUNTIME
 *          源码       字节码    运行时
 *          .java文件  .class文件  Class对象
 *          （程序员)     (编译器）    （类加载器，JVM）
 *      2）反射技术 运行时操作类
 *          I.运行时的类：Class对象
 *          II.操作类：
 */
public class Demo {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException {
        //获取Class对象
        Class<?> clazz = Class.forName("com.itheima.annotation.Student");
        Student student = (Student) clazz.newInstance();

        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            boolean annotationPresent = declaredField.isAnnotationPresent(MyValue.class);
            if (annotationPresent){
                MyValue annotation = declaredField.getAnnotation(MyValue.class);
                declaredField.setAccessible(true);
                if (declaredField.getName().equals("age")){
                    declaredField.set(student,Integer.parseInt(annotation.value()));
                }else {
                    declaredField.set(student,annotation.value());
                }
            }
        }

        System.out.println(student);
    }
}
